home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / cd2pcmt / source.lzh / cd2pcm.c < prev    next >
Text File  |  1997-10-03  |  29KB  |  1,005 lines

  1. /*--------------------------------------------------------------*/
  2. /*                                */
  3. /*                                */
  4. /*                                */
  5. /*  CD2PCMt.x: 一応汎用CD-ROM CD-DA DATA 読み込みProg.        */
  6. /*                                */
  7. /*            Copyright 1995-96 TNB製作所        */
  8. /*                                */
  9. /*                                */
  10. /*                                */
  11. /*    Orig.                            */
  12. /*  cd2pcm.x: SONY CDU-561・CDU-55S & TOSHIBA XM-3401TA・XM-4101TA*/
  13. /*         オーディオデータ取り込みプログラム    Ver 0.8a */
  14. /*       Copyright(c) 1993-1994 WATA    (渡邉 正治)    */
  15. /*                        Made in Osaka.    */
  16. /*                                */
  17. /*                                */
  18. /*        PCM SUB. PCMLIB.A ver 1.03a written by GORRY    */
  19. /*             adpcmlib.a ver 0.01 (C) Otankonas    */
  20. /*                                */
  21. /*                                */
  22. /*--------------------------------------------------------------*/
  23. #include <stdio.h>
  24. #include <string.h>
  25. #include <stdlib.h>
  26. #include <TNB.H>
  27. #include "cd2pcm.h"
  28. #include "extern.h"
  29.  
  30. static    char    outfile_pcm[]  = "TEST.P16";
  31. static    char    outfile_adpcm[] = "TEST.PCM";
  32. static    char    outfile_wave[]  = "TEST.WAV";
  33. static    char    outfile_s44[]  = "TEST.S44";
  34. static    char    outfile_a44[]  = "TEST.A44";
  35. static    char    outfile_m44[]  = "TEST.M44";
  36. static    char    outfile_s22[]  = "TEST.S22";
  37. static    char    outfile_a22[]  = "TEST.A22";
  38. static    char    outfile_a88[]  = "TEST.A88";
  39.  
  40. void    main( int argc, char *argv[] )
  41. {
  42. int    i,j,mode,min,max,dmy,adr;
  43. int    start,end,music_no;
  44. int    tstart,tend,shigh,smid,slow,ehigh,emid,elow;
  45. char    *arg;
  46. char    *ptr;                /* 環境変数 "CD-ROM" のポインター */
  47. char    buf[256];
  48. unsigned char buf2[256];
  49. int    of = 0;
  50.  
  51. printf(
  52.     "X68k CDtoPCM [CD2PCMt.x] Version 0.96A Copyright 1995-1997 TNB製作所\n"
  53.     "    Orig. cd2pcm Ver 0.8a Copyright (c) 1993-1994 by WATA\n"
  54. );
  55.  
  56. /* 変数初期化 */
  57. mode        = cd_演奏情報;
  58. SCSI_ID        = -1;
  59. CDC_ID        = -1;
  60. adr_offset    = 0;                /* デフォルトセット */
  61. waru        = 16;                /* デフォルトセット */
  62. convert_mode    = CONVERT_M;            /* デフォルトセット */
  63. outfile        = NULL;
  64. pcm_mode    = CONVERT_PCM15;
  65. adpcm_flg    = 1;                /* 1;ADPCM 0;PCM 2;WAVE */
  66. cd_speed    = -1;                /* 現在の速度で取り込む */
  67. check_fg    = 0;                /* チェックしない。*/
  68. disp_fg        = 0;                /* 表示する。 */
  69. buf_size    = -1;                /* MEM取れるだけ */
  70. write_size    = 0;                /* DISKに書き込んだサイズ*/
  71. CDROM_DRIVE    = -1;
  72. retry_fg    = 0;            /* -retry[n] 取り込みエラーが出た場合[n]回挑戦*/
  73. errjmp_fg    = 0;            /* 致命的でないエラーは無視します。*/
  74. errod_fg    = 0;            /* -ejjod */
  75. pcm_rate    = -1;            /* -rate 0;15625 変換レート*/
  76. secone_fg    = 0;
  77. inqu_sw        = -1;
  78. evn        = 0;            /*環境変数チェック*/
  79. retry_mx    = 0;            /* エラーの最大リトライ数 */
  80. errjmp_mx    = 0;            /* 致命的でないエラーの数 */
  81. fcmppr        = 0;            /* 比較時の一致とみなす一致パーセント数 */
  82. dma_fg        = 1;            /* DMAC使用フラグ*/
  83. sct_fg        = 0;            /* SCSITAI 使用フラグ*/
  84. stm_fg        = 0;            /* SCSITAI & マニュアル転送フラグ*/
  85. mach2_fg    = 0;            /* Mach2 フラグ*/
  86. test_fg        = 0;            /* test フラグ */
  87. merc_fg        = 0;            /* まーきゅりフラグ*/
  88. cdspeed        = 0;            /* MMC 対応 スピード*/
  89. MT_bak[0]    = 0xFF;
  90.  
  91.  
  92. /* オプション解析処理 */
  93. for(i=1;;i++){
  94.     if ( evn && i>=argc )
  95.         break;
  96.     if ( (arg=SwitchDisp(i,argc,argv))==0 )
  97.         break;
  98.     if ( arg[0] == '-' || arg[0] == '/' ){
  99.         switch(arg[1]|0x20){
  100.         case 's':
  101.             if ( stricmp( "ony" ,&arg[2] ) == 0 ){
  102.                 CDROM_DRIVE=CD_CDU561;
  103.                 inqu_sw = 1;
  104.             } else if ( stricmp( "econe" ,&arg[2] ) == 0 ){
  105.                 secone_fg=-1;
  106.             } else if ( arg[2] == 0 ){
  107.                 mode = cd_演奏中断;
  108.             } else {
  109.                 printf("オプションエラーです。\n" );
  110.                 exit(1);
  111.             }
  112.             break;
  113.         case 'd':
  114.             if ( stricmp( "ma" ,&arg[2] ) == 0 ){
  115.                 dma_fg = 1;            /* DMAC使用フラグ*/
  116.             } else {
  117.                 printf("オプションエラーです。\n" );
  118.                 exit(1);
  119.             }
  120.             break;
  121.         case 't':
  122.             if ( stricmp( "est" ,&arg[2] ) == 0 ){
  123.                 test_fg=1;        /* 転送テストフラグ*/
  124.             } else if ( stricmp( "oshiba" ,&arg[2] ) == 0 ){
  125.                 CDROM_DRIVE=TOSHIBATYPE;
  126.                 inqu_sw = 1;
  127.             } else {
  128.                 printf("オプションエラーです。\n" );
  129.                 exit(1);
  130.             }
  131.             break;
  132.         case 'c':
  133.             if ( strncmp( "dspeed" ,&arg[2],6 ) == 0 ){
  134.                 if ( sscanf( &arg[8],"%d", &cdspeed )!=1 ){
  135.                     printf("cdspeed 値がありません。\n");
  136.                     exit(1);
  137.                 }
  138.                 if ( cdspeed<1 || cdspeed>30 ){
  139.                     printf("cdspeed 値が異常です。\n");
  140.                     exit(1);
  141.                 }
  142.             } else if ( strncmp( "hkp" ,&arg[2],3 ) == 0 ){
  143.                 if ( sscanf( &arg[5],"%d", &fcmppr )!=1 ){
  144.                     printf("chkp 値がありません。\n");
  145.                     exit(1);
  146.                 }
  147.                 if ( fcmppr<0 || fcmppr>100 ){
  148.                     printf("chkp 値が異常です。\n");
  149.                     exit(1);
  150.                 }
  151.             } else if ( stricmp( "heck" ,&arg[2] ) == 0 ){
  152.                 check_fg = 1;
  153.             } else if ( stricmp( "hecks" ,&arg[2] ) == 0 ){
  154.                 check_fg = 2;
  155.             } else if ( arg[2] == 0 ){
  156.                 mode = cd_演奏再開;
  157.             } else {
  158.                 printf("オプションエラーです。\n" );
  159.                 exit(1);
  160.             }
  161.             break;
  162.         case 'l':
  163.             if ( (arg[2]|0x20) == 'e' ){
  164.                 convert_mode = CONVERT_L;
  165.                 adr_offset   = 0;
  166.             } else {
  167.                 mode = cd_演奏リスト;
  168.             }
  169.             break;
  170.         case 'i':
  171.             if ( (arg[2]|0x20)=='d' ){
  172.                 SCSI_ID = arg[3] - '0';
  173.                 if ( SCSI_ID<0 || SCSI_ID>9 ) {
  174.                     j=(arg[3]|0x20) - 'a';
  175.                     if ( j>=0 && j<=5 ){
  176.                         SCSI_ID = 10 + j;
  177.                     } else {
  178.                         printf(" SCSI-ID が異常です。\n");
  179.                         exit(1);
  180.                     }
  181.                 } else {
  182.                     j=arg[4] - '0';
  183.                     if ( j>=0 && j<=15 )
  184.                         SCSI_ID = SCSI_ID*10 + j;
  185.                     if ( SCSI_ID<0 || SCSI_ID>15 ){
  186.                         printf(" SCSI-ID が異常です。\n");
  187.                         exit(1);
  188.                     }
  189.                 }
  190.             } else {
  191.                 SCSI_ID = arg[2] - '0';
  192.                 if ( SCSI_ID<0 || SCSI_ID>9 ) {
  193.                     j=(arg[2]|0x20) - 'a';
  194.                     if ( j>=0 && j<=5 ){
  195.                         SCSI_ID = 10 + j;
  196.                     } else {
  197.                         printf(" SCSI-ID が異常です。\n");
  198.                         exit(1);
  199.                     }
  200.                 } else {
  201.                     j=arg[3] - '0';
  202.                     if ( j>=0 && j<=15 )
  203.                         SCSI_ID = SCSI_ID*10 + j;
  204.                     if ( SCSI_ID<0 || SCSI_ID>15 ){
  205.                         printf(" SCSI-ID が異常です。\n");
  206.                         exit(1);
  207.                     }
  208.                 }
  209.             }
  210.             break;
  211.         case 'h':
  212.             if ( strncmp( "rate" ,&arg[2],4 ) == 0 ){
  213.                 pcm_rate = 22050;
  214.                 break;
  215.             }
  216.             cd2pcm_help();
  217.             exit(0);
  218.             break;
  219.         case '?':
  220.             cd2pcm_help();
  221.             exit(0);
  222.             break;
  223.         case 'g':
  224.             if ( (arg[2]|0x20) == 't' ){
  225.                 mode = cd_取り込み2;
  226.                 switch( sscanf( &arg[3],"%d/%d%1s%d%1s%d%1s%d%1s%d%1s%d",
  227.                         &music_no,
  228.                         &shigh,&buf[0],&smid,&buf[1],&slow,&buf[2],
  229.                         &ehigh,&buf[3],&emid,&buf[4],&elow ) )
  230.                 {
  231.                  case 12:
  232.                     tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
  233.                     tstart = tstart - ( 2 * 75 );
  234.                     tend   = ( ehigh * 60 * 75 ) + ( emid * 75 ) + elow ;
  235.                     tend   = tend   - ( 2 * 75 );
  236.                     if ( buf[0]!=':' || buf[1]!=':' || buf[2]!='-' ||
  237.                         buf[3]!=':' || buf[4]!=':' || slow>=75 ||
  238.                         elow>=75 || smid>=60 || emid>=60 ||
  239.                         tstart<-150 || tend<=-150 || tstart>=tend ||
  240.                         music_no<=0 )
  241.                     {
  242.                         printf("読み込み時間の設定が異常です。\n" );
  243.                         exit(1);
  244.                     }
  245.                     break;
  246.                  case 7:
  247.                     tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
  248.                     tstart = tstart - ( 2 * 75 );
  249.                     tend   = -1;
  250.                     if ( buf[0] != ':' || buf[1] != ':' || buf[2] != '-' ||
  251.                         slow >= 75 || smid >=60 || tstart < -150 ||
  252.                         music_no <= 0  )
  253.                     {
  254.                         printf("読み込み時間の設定が異常です。\n" );
  255.                         exit(1);
  256.                     }
  257.                     break;
  258.                  default:
  259.                     music_no = 0;
  260.                     switch( sscanf( &arg[3],"%d%1s%d%1s%d%1s%d%1s%d%1s%d",
  261.                             &shigh,&buf[0],&smid,&buf[1],&slow,&buf[2],
  262.                             &ehigh,&buf[3],&emid,&buf[4],&elow ) )
  263.                     {
  264.                      case 11:
  265.                         tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
  266.                         tstart = tstart - ( 2 * 75 );
  267.                         tend   = ( ehigh * 60 * 75 ) + ( emid * 75 ) + elow ;
  268.                         tend   = tend   - ( 2 * 75 );
  269.                         if ( buf[0] != ':' || buf[1] != ':' || buf[2] != '-' ||
  270.                             buf[3] != ':' || buf[4] != ':' || slow >= 75 ||
  271.                             elow >= 75 || smid >=60 || emid >=60 ||
  272.                             tstart < 0 || tend <= 0 || tstart >= tend )
  273.                         {
  274.                             printf("読み込み時間の設定が異常です。\n" );
  275.                             exit(1);
  276.                         }
  277.                         break;
  278.                      case 6:
  279.                         tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
  280.                         tstart = tstart - ( 2 * 75 );
  281.                         tend   = -1;
  282.                         if ( buf[0] != ':' || buf[1] != ':' || buf[2] != '-' ||
  283.                             slow >= 75 || smid >=60 || tstart < 0 )
  284.                         {
  285.                             printf("読み込み時間の設定が異常です。\n" );
  286.                             exit(1);
  287.                         }
  288.                         break;
  289.                      default:
  290.                         printf("読み込み時間の設定が異常です。\n" );
  291.                         exit(1);
  292.                         break;
  293.                     }
  294.                 }
  295.             } else {
  296.                 mode = cd_取り込み;
  297.                 switch( sscanf( &arg[2],"%d",&music_no ) ){
  298.                 case 1:
  299.                     break;
  300.                 default:
  301.                     printf("曲番号の指定が異常です。\n" );
  302.                     exit(1);
  303.                     break;
  304.                 }
  305.             }
  306.             break;
  307.         case 'o':
  308.             outfile = &arg[2];
  309.             of = -1;
  310.             break;
  311.         case 'p':
  312.             if ( stricmp( "n" , &arg[2] ) == 0 ){
  313.                 disp_fg = 1;
  314.                 break;
  315.             }
  316.             if ( stricmp( "cms" ,&arg[2] ) == 0 ){
  317.                 pcm_mode = 0;
  318.                 adpcm_flg = 0;
  319.                 if ( of==0 ) outfile = outfile_s44;
  320.                 break;
  321.             }
  322.             if ( stricmp( "cma" ,&arg[2] ) == 0 ){
  323.                 pcm_mode = CONVERT_PCMA;
  324.                 adpcm_flg = 0;
  325.                 if ( of==0 ) outfile = outfile_a44;
  326.                 break;
  327.             }
  328.             if ( stricmp( "cmr" ,&arg[2] ) == 0 ){
  329.                 pcm_mode = CONVERT_PCMR;
  330.                 adpcm_flg = 0;
  331.                 if ( of==0 ) outfile = outfile_m44;
  332.                 break;
  333.             }
  334.             if ( stricmp( "cml" ,&arg[2] ) == 0 ){
  335.                 pcm_mode = CONVERT_PCML;
  336.                 adpcm_flg = 0;
  337.                 if ( of==0 ) outfile = outfile_m44;
  338.                 break;
  339.             }
  340.             if ( stricmp( "cmm" ,&arg[2] ) == 0 ){
  341.                 pcm_mode = CONVERT_PCMM;
  342.                 adpcm_flg = 0;
  343.                 if ( of==0 ) outfile = outfile_m44;
  344.                 break;
  345.             }
  346.             if ( stricmp( "cm15" ,&arg[2] ) == 0 ) {
  347.                 pcm_mode = CONVERT_PCM15;
  348.                 adpcm_flg = 0;
  349.                 break;
  350.             }
  351.             printf("オプションエラーです。\n" );
  352.             exit(1);
  353.             break;
  354.         case 'e':
  355.             if ( stricmp( "rrjmp" ,&arg[2] ) == 0 ){
  356.                 errjmp_fg = 1;    /* 致命的でないエラーは無視します。*/
  357.             } else if ( stricmp( "rrod" ,&arg[2] ) == 0 ){
  358.                 errod_fg= 1;
  359.             } else if ( stricmp( "nv" ,&arg[2] ) == 0 ){
  360.                 evn= 1;
  361.             } else {
  362.                 printf("オプションエラーです。\n" );
  363.                 exit(1);
  364.             }
  365.             break;
  366.         case 'r':
  367.             strlwr( &arg[1] );
  368.             if ( strncmp( "ate" ,&arg[2],3 ) == 0 ){
  369.                 if ( sscanf( &arg[5],"%d", &pcm_rate )!=1 ){
  370.                     printf(" rate 値が異常です。\n");
  371.                     exit(1);
  372.                 }
  373.                 if ( pcm_rate >= 1 && pcm_rate<=441 ){
  374.                     pcm_rate*=100;
  375.                 } else if ( pcm_rate >= 3900 && pcm_rate<=44100 ){
  376.                     ;
  377.                 } else {
  378.                     printf(" rate 値が異常です。\n");
  379.                     exit(1);
  380.                 }
  381.                 break;
  382.             } else if ( strncmp( "etry" ,&arg[2],4 ) == 0 ){
  383.                 if ( sscanf( &arg[6],"%d", &retry_fg )!=1 ){
  384.                     printf(" retry 値が異常です。\n");
  385.                     exit(1);
  386.                 }
  387.                 if ( retry_fg < 1 || retry_fg > 60000 ){
  388.                     printf(" retry 値が異常です。\n");
  389.                     exit(1);
  390.                 }
  391.                 break;
  392.             } else if ( arg[2] == 0 ){
  393.                 convert_mode = CONVERT_R;
  394.                 adr_offset   = 2;
  395.                 break;
  396.             } else if ( stricmp( "ight" ,&arg[2] ) == 0 ){
  397.                 convert_mode = CONVERT_R;
  398.                 adr_offset   = 2;
  399.                 break;
  400.             } else {
  401.                 printf("オプションエラーです。\n" );
  402.                 exit(1);
  403.             }
  404.             break;
  405.         case 'm':
  406.             if ( stricmp( "br7" ,&arg[2] ) == 0 ){
  407.                 mbr7f=1;
  408.                 break;
  409.             } else if ( stricmp( "erc" ,&arg[2] ) == 0 ){
  410.                 merc_fg=1;
  411.                 break;
  412.             } else if ( stricmp( "ix" ,&arg[2] ) == 0 ){
  413.                 convert_mode = CONVERT_M;
  414.                 break;
  415.             } else if ( stricmp( "an" ,&arg[2] ) == 0 ){
  416.                 stm_fg=1;            /* SCSITAI & マニュアル転送フラグ*/
  417.                 break;
  418.             } else if ( stricmp( "pu" ,&arg[2] ) == 0 ){
  419.                 dma_fg = 0;            /* DMAC使用フラグ*/
  420.                 break;
  421.             }
  422.             if ( (arg[2]|0x20) == 'a' ){
  423.                 buf_size = -1;    /* 最大 */
  424.                 break;
  425.             }
  426.             /* -mN Nは、数字で N秒分のワーク */
  427.             switch( sscanf( &arg[2],"%d", &buf_size ) ){
  428.              case 1:
  429.                 if ( buf_size == 0 ){
  430.                     printf("-m[n] の値が異常です。\n" );
  431.                     exit(1);
  432.                     break;
  433.                 }
  434.                 break;
  435.              default:
  436.                 printf("-m[n] の値が異常です。\n" );
  437.                 exit(1);
  438.                 break;
  439.             }
  440.             break;
  441.         case 'a':
  442.             switch(arg[2]|0x20){
  443.             case 'r':
  444.                 convert_mode = CONVERT_AVE_R;
  445.                 //adr_offset   = 2;
  446.                 break;
  447.             case 'l':
  448.                 convert_mode = CONVERT_AVE_L;
  449.                 //adr_offset   = 0;
  450.                 break;
  451.             case 'm':
  452.                 convert_mode = CONVERT_AVE_M;
  453.                 break;
  454.             case 'd':
  455.                 if ( stricmp("pcm", &arg[3]) == 0 ){
  456.                     pcm_mode = CONVERT_PCM15;
  457.                     adpcm_flg = 1;
  458.                     if ( of==0 ) outfile = outfile_adpcm;
  459.                     break;
  460.                 } else {
  461.                     printf("オプションエラーです。\n" );
  462.                     exit(1);
  463.                 }
  464.             case '8':
  465.                 if ( stricmp("8", &arg[3]) == 0 ){
  466.                     pcm_mode = CONVERT_A88;
  467.                     adpcm_flg = 1;
  468.                     if ( of==0 ) outfile = outfile_a88;
  469.                     break;
  470.                 }
  471.             default:
  472.                 printf("オプションエラーです。\n" );
  473.                 exit(1);
  474.             }
  475.             break;
  476.         case 'n':
  477.             cd_speed = 0;
  478.             break;
  479.         case 'f':
  480.             cd_speed = 1;
  481.             break;
  482.         case 'u':
  483.             cd_speed = 2;
  484.             break;
  485.         case 'v':
  486.             if ( sscanf( &arg[2],"%d", &waru )!=1 ){
  487.                 printf(" 音量調節(-v)の値が異常です。\n");
  488.                 exit(1);
  489.                 break;
  490.             }
  491.             if ( waru == 0 || waru > 256 ){
  492.                 printf(" 音量調節(-v)の値が異常です。\n");
  493.                 exit(1);
  494.             }
  495.             break;
  496.         case 'w':
  497.             if ( stricmp( "ave" ,&arg[2] ) == 0 ){
  498.                 pcm_mode = CONVERT_WAVE;
  499.                 adpcm_flg = 2;
  500.                 if ( of==0 ) outfile = outfile_wave;
  501.             } else {
  502.                 printf("オプションエラーです。\n" );
  503.                 exit(1);
  504.             }
  505.             break;
  506.         default:
  507.             printf("オプションエラーです。\n" );
  508.             //if ( sscanf( &arg[1],"%d", &waru )!=1 ){
  509.             //    printf("音量調節の入力がへん\n");
  510.             //    exit(1);
  511.             //    break;
  512.             //}
  513.             //if ( waru == 0 || waru > 256 ){
  514.             //    printf("音量調節の入力がへん\n");
  515.             //    exit(1);
  516.             //}
  517.             break;
  518.         }
  519.     } else {
  520.         if ( stricmp( "all", &arg[0] ) == 0 ){
  521.             mode     = cd_演奏開始_ALL;    /* ALL 演奏 */
  522.         } else {
  523.             mode = cd_演奏開始2;
  524.             /* 演奏時間オフセットチェック */
  525.             switch( sscanf( &arg[0],"%d/%d:%d:%d%1s%d:%d:%d",
  526.                     &music_no,
  527.                     &shigh,&smid,&slow,&buf[2],
  528.                     &ehigh,&emid,&elow ) )
  529.             {
  530.              case 8:
  531.                 tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
  532.                 tend   = ( ehigh * 60 * 75 ) + ( emid * 75 ) + elow ;
  533.                 if ( buf[2] != '-' || slow >= 75 ||
  534.                     elow >= 75 || smid >=60 || emid >=60 ||
  535.                     tstart < 0 || tend <= 0 || tstart >= tend ||
  536.                     music_no <= 0 )
  537.                 {
  538.                     printf("演奏時間の設定が異常です。\n" );
  539.                     exit(1);
  540.                 }
  541.                 break;
  542.              case 5:
  543.                 tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
  544.                 tend   = -1;
  545.                 if ( buf[2] != '-' ||
  546.                     slow >= 75 || smid >=60 || tstart < 0 || start <= 0 )
  547.                 {
  548.                     printf("演奏時間の設定が異常です。\n" );
  549.                     exit(1);
  550.                 }
  551.                 break;
  552.              default:
  553.                 music_no = 0;
  554.                 switch( sscanf( &arg[0],"%d:%d:%d%1s%d:%d:%d",
  555.                         &shigh,&smid,&slow,&buf[2],
  556.                         &ehigh,&emid,&elow ) )
  557.                 {
  558.                  case 7:
  559.                     tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
  560.                     tend   = ( ehigh * 60 * 75 ) + ( emid * 75 ) + elow ;
  561.                     if ( buf[2] != '-' ||
  562.                         slow >= 75 ||
  563.                         elow >= 75 || smid >=60 || emid >=60 ||
  564.                         tstart < 0 || tend <= 0 || tstart >= tend )
  565.                     {
  566.                         printf("演奏時間の設定が異常です。\n" );
  567.                         exit(1);
  568.                     }
  569.                     break;
  570.                  case 4:
  571.                     tstart = ( shigh * 60 * 75 ) + ( smid * 75 ) + slow ;
  572.                     tend   = -1;
  573.                     if ( buf[2] != '-' ||
  574.                         slow >= 75 || smid >=60 || tstart < 0  )
  575.                     {
  576.                         printf("演奏時間の設定が異常です。\n" );
  577.                         exit(1);
  578.                     }
  579.                     break;
  580.                  default:
  581.                     mode = cd_演奏開始;
  582.                     if ( sscanf( &arg[0],"%d%1s%d", &start,buf,&end )==3 ){
  583.                         if ( start >= end || buf[0] != '-' ){
  584.                             printf("曲番号の指定が異常です。\n");
  585.                             exit(1);
  586.                         }
  587.                     } else if ( sscanf( &arg[0],"%d%1s", &start,buf )==2 ){
  588.                         if ( buf[0] != '-' ){
  589.                             printf("曲番号の指定が異常です。\n");
  590.                             exit(1);
  591.                         }
  592.                         end = -1;    /* 最後まで */
  593.                     } else if ( sscanf( &arg[0],"%d", &start )==1 ){
  594.                         end=start;
  595.                     } else {
  596.                         printf("曲番号の指定が異常です。\n");
  597.                         exit(1);
  598.                     }
  599.                 }
  600.             }
  601.         }
  602.     }
  603. }
  604. /* オプション解析処理 終了 */
  605. if ( test_fg!=0 || merc_fg!=0 ){
  606.     /*テストフラグ*/
  607.     pcm_mode = 0;
  608.     adpcm_flg = 0;
  609.     pcm_rate = -1;            /* -rate 0;15625 変換レート*/
  610.     check_fg = 0;
  611.  
  612.     test_fg = -1;
  613. }
  614.  
  615. if ( pcm_mode==0 || pcm_mode==CONVERT_PCMA || pcm_mode==CONVERT_WAVE ){
  616.     if ( pcm_rate<0 ){
  617.         pcm_rate    = 44100;
  618.     } else if ( pcm_rate == 22050 ){
  619.         if ( of==0 ){
  620.             if ( pcm_mode==0 )
  621.                 outfile = outfile_s22;
  622.             else if ( pcm_mode==CONVERT_PCMA )
  623.                 outfile = outfile_a22;
  624.             else    outfile = outfile_wave;
  625.         }
  626.     } else {
  627.         printf(" rate の指定が異常です。\n");
  628.         exit(1);
  629.     }
  630. } else {
  631.     if ( pcm_rate<0 )
  632.         pcm_rate    = 15625;        /* -rate 0;15625 変換レート*/
  633. }
  634.  
  635. if ( outfile == NULL ){
  636.     if ( adpcm_flg == 0 )
  637.         outfile = outfile_pcm;            /* デフォルトファイル名セット */
  638.     else if ( adpcm_flg == 1 )
  639.         outfile = outfile_adpcm;        /* デフォルトファイル名セット */
  640.     else    outfile = outfile_wave;            /* デフォルトファイル名セット */
  641. }
  642.  
  643. CDC_ID =CDCID();
  644. if ( CDC_ID >=0 )
  645.     CDC_ID &= 0x00FFFFFF;
  646.  
  647. if ( SCSI_ID == -1 )
  648.     SCSI_ID = CDC_ID;
  649. if ( SCSI_ID == -1 ){
  650.     SCSI_ID = DEF_SCSI_ID;        /* デフォルトを仮設定 */
  651.     ptr = (char *)getenv( "MUSIC-CDROM" );
  652.     if ( ptr == NULL )
  653.         ptr = (char *)getenv( "CDROM" ) ;
  654.     if ( ptr != NULL ){
  655.         SCSI_ID = ptr[0] - '0';
  656.         if ( SCSI_ID<0 || SCSI_ID>9 ) {
  657.             i=(ptr[0]|0x20) - 'a';
  658.             if ( i>=0 && i<=5 ){
  659.                 SCSI_ID = 10 + i;
  660.             } else {
  661.                 printf("環境変数 `CDROM' が正しく設定されていません。\n");
  662.                 exit(1);
  663.             }
  664.         } else {
  665.             i=ptr[1] - '0';
  666.             if ( i>=0 && i<=9 )
  667.                 SCSI_ID = SCSI_ID*10 + i;
  668.             if ( SCSI_ID<0 || SCSI_ID>15 ) {
  669.                 printf("環境変数 `CDROM' が正しく設定されていません。\n");
  670.                 exit(1);
  671.             }
  672.         }
  673.     }
  674. }
  675. if ( S_TW_CHK()!=-2 )
  676.     i=S_LEVEL_();
  677. else    i=S_TW_LEVEL(SCSI_ID);
  678. if ( dma_fg==0 ){
  679.     // MPU 転送
  680.     if ( (i&0xFF00)==0x5400 && (i&0xFF)>=1 ){
  681.         if ( stm_fg == 0 )
  682.             sct_fg = 1;            /* SCSITAI 使用フラグ*/
  683.     }
  684. } else {
  685.     // DMA 転送
  686.     sct_fg = 0;            /* SCSITAI 使用フラグ*/
  687.     stm_fg = 0;            /* SCSITAI & マニュアル転送フラグ*/
  688.     if ( (i&0xFF00)==0x6400 )
  689.         mach2_fg  = 1;        /* Mach2 フラグ*/
  690. }
  691. sprintf(pcm_rate_str,"%.3f",(double)pcm_rate/1000.);
  692.  
  693. breakmd=BREAKCK(-1);    /* 起動時のbreak状態 */
  694.  
  695. INTVCS(0xFFF1,(void*)AbortDisp);
  696.  
  697. /* 装置動作可能かチェックする */
  698. for( i=0;i<5;i++ ){
  699.     /*-- メディアチェック --*/
  700.     /*まず inq.データの大きさを調べる*/
  701.     if ( S_INQUIRY( 5, SCSI_ID, (void*)buf2 ) != 0 ){
  702.         printf("指定された SCSI-ID=%d ",SCSI_ID&0xFF );
  703.         if ( SCSI_ID&0xFFFF0000 )
  704.             printf("LUN=%d ",SCSI_ID/0x10000 );
  705.         printf("の INQUIRY に失敗しました。\n");
  706.         EndtDisp(1);
  707.     }
  708.     /*inq.データの大きさ分読み込む*/
  709.     if ( S_INQUIRY( buf2[4]+5, SCSI_ID, (void*)buf ) != 0 ){
  710.         printf("指定された SCSI-ID=%d ",SCSI_ID&0xFF );
  711.         if ( SCSI_ID&0xFFFF0000 )
  712.             printf("LUN=%d ",SCSI_ID/0x10000 );
  713.         printf("の INQUIRY に失敗しました。\n");
  714.         EndtDisp(1);
  715.     }
  716.     if ( buf[0]!=0x05 && buf[0]!=0x04 ){
  717.         printf("指定された SCSI-ID=%d ",SCSI_ID&0xFF );
  718.         if ( SCSI_ID&0xFFFF0000 )
  719.             printf("LUN=%d ",SCSI_ID/0x10000 );
  720.         printf("の装置は、CD-ROM ではないようです。\n");
  721.         EndtDisp(1);
  722.     }
  723.     if ( CDROM_DRIVE<0 ){
  724.         if ( memcmp( "SONY    CD-ROM CDU-561", &buf[8],22 ) == 0 ){
  725.             CDROM_DRIVE = CD_CDU561;
  726.         } else if ( memcmp( "SONY    CD-ROM CDU-55S", &buf[8],22)==0){
  727.             CDROM_DRIVE = CD_CDU561;
  728.  
  729.         } else if ( memcmp( "NRC     MBR-7", &buf[8],13)==0){
  730.             CDROM_DRIVE = CD_CDU561;
  731.         } else if ( memcmp( "MATSHITAPD-1 LF", &buf[8],15)==0){
  732.             CDROM_DRIVE = CD_CDU561;
  733.  
  734.         } else if ( memcmp( "TOSHIBA CD-ROM XM-3401TA", &buf[8],24)==0){
  735.             CDROM_DRIVE = TOSHIBATYPE;
  736.         } else if ( memcmp( "TOSHIBA CD-ROM XM-4101TA", &buf[8],24)==0){
  737.             CDROM_DRIVE = TOSHIBATYPE;
  738.         } else {
  739.             CDROM_DRIVE = -1;
  740.         }
  741.     }
  742.     /* 装置動作可能かチェック */
  743.     j=S_TESTUNIT(SCSI_ID);
  744.     if ( j!=0 && j!=1 )
  745.         continue;
  746.     /* 演奏するでえ */
  747.     switch( mode ){
  748.     case cd_演奏開始:
  749.         cd_play(start,end);
  750.         CDCRESET();
  751.         EndtDisp0(0);
  752.     case cd_演奏開始2:
  753.         cd_play2(music_no,tstart,tend);
  754.         CDCRESET();
  755.         EndtDisp0(0);
  756.     case cd_演奏開始_ALL:
  757.         cd_play_all();
  758.         CDCRESET();
  759.         EndtDisp0(0);
  760.     case cd_演奏中断:
  761.         cd_play_pause();
  762.         CDCRESET();
  763.         EndtDisp0(0);
  764.     case cd_演奏再開:
  765.         cd_play_resume();
  766.         CDCRESET();
  767.         EndtDisp0(0);
  768.     case cd_演奏情報:
  769.         cd_play_inf();
  770.         EndtDisp0(0);
  771.     case cd_演奏リスト:
  772.         cd_play_list();
  773.         EndtDisp0(0);
  774.     case cd_取り込み:
  775.         if ( RedTOC( &dmy, &min, &max )!= 0 ){
  776.             printf(" Read TOC でエラーが発生しました。\n");
  777.             EndtDisp(1);
  778.         }
  779.         if ( music_no < min || music_no > max ){
  780.             printf("番号の設定が異常です。\n");
  781.             printf("曲番号は %d ~ %d まで有効です。\n",min, max );
  782.             EndtDisp(1);
  783.         }
  784.         if ( CDROM_DRIVE == -1 ){
  785.             CDROM_DRIVE = SONYTYPE;
  786.             //printf("現在 %s は、",&buf[8]);
  787.             //printf("サポート出来ないか、していません。\n");
  788.             //EndtDisp(1);
  789.         }
  790.         cdda2pcm( music_no, 0,0  );    /* 取り込む */
  791.         EndtDisp(0);
  792.     case cd_取り込み2:
  793.         if ( CDROM_DRIVE == -1 ){
  794.             CDROM_DRIVE = SONYTYPE;
  795.             //printf("現在 %s は、",&buf[8]);
  796.             //printf("サポート出来ないか、していません。\n");
  797.             //EndtDisp(1);
  798.         }
  799.         if ( music_no != 0 ){
  800.             if ( RedTOC( &dmy, &min, &max ) != 0 ){
  801.                 printf(" Read TOC でエラーが発生しました。\n");
  802.                 EndtDisp(1);
  803.             }
  804.             if ( music_no < min || music_no > max ){
  805.                 printf("番号の設定が異常です。\n" );
  806.                 printf("曲番号は %d ~ %d まで有効です。\n", min, max );
  807.                 EndtDisp(1);
  808.             } else {
  809.                 if ( Music_inf( music_no, &adr ) == 0 ){
  810.                     tstart = tstart + time2bin(adr);
  811.                     if ( tend != -1 )
  812.                         tend = tend + time2bin(adr);
  813.                 } else {
  814.                     printf(    "Start Track Address or ReadTOC Command error "
  815.                         "のため演奏時間は分かりませんでした。\n"
  816.                     );
  817.                     EndtDisp(1);
  818.                 }
  819.             }
  820.         }
  821.         cdda2pcm( -1, tstart, tend );    /* 取り込む */
  822.         EndtDisp(0);
  823.     }
  824.     EndtDisp(0);
  825. }
  826. j=S_TESTUNIT(SCSI_ID);
  827. printf("指定された SCSI-ID=%d ",SCSI_ID&0xFF);
  828. if ( SCSI_ID&0xFFFF0000 )
  829.     printf("LUN=%d ",SCSI_ID/0x10000 );
  830. if ( j<0 )
  831.     printf("の装置は、現在動作不可能です。\n");
  832. else    printf("の装置にメディアが未挿入です。\n");
  833. EndtDisp(1);
  834. }
  835. /****************************************/
  836. /*        Print            */
  837. /****************************************/
  838. void    printf_(d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12)
  839. int    d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12;
  840. {
  841. if ( disp_fg==0 )
  842.     printf((void*)d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12);
  843. }
  844. /****************************************/
  845. /*        ABORT 終了        */
  846. /****************************************/
  847. void    AbortDisp()
  848. {
  849. C_CURON();        /* カーソルON */
  850. S_RESET();
  851. S_REZEROUNIT(SCSI_ID);
  852. BREAKCK(breakmd);
  853. printf("\x1B""0");
  854. printf("\n"CFC"CD2PCMt.x : アボートしました。\n");
  855. KFLUSHIO(0xFF);
  856. exit(1);
  857. }
  858. /*+++++++*/
  859. void    EndtDisp0(int ec)
  860. {
  861. C_CURON();        /* カーソルON */
  862. if ( MT_bak[0]!=0xFF )
  863.     S_MODESELECT( PF, 12, SCSI_ID, MT_bak );
  864. KFLUSHIO(0xFF);
  865. printf("\x1B""0");
  866. exit(ec);
  867. }
  868. /*+++++++*/
  869. void    EndtDisp(int ec)
  870. {
  871. C_CURON();        /* カーソルON */
  872. S_REZEROUNIT(SCSI_ID);
  873. if ( MT_bak[0]!=0xFF )
  874.     S_MODESELECT( PF, 12, SCSI_ID, MT_bak );
  875. KFLUSHIO(0xFF);
  876. printf("\x1B""0");
  877. exit(ec);
  878. }
  879. /*************************************************************************
  880.                             スイッチ処理
  881. *************************************************************************/
  882. char    *SwitchDisp(n,argc,argv)
  883. int    n;
  884. int    argc;
  885. char    *argv[];
  886. {
  887. static    char    ss[256];
  888. int    i,j;
  889. if ( n<argc )
  890.     return(argv[n]);
  891. n-=argc;
  892. if ( GETENV("CD2PCM",0,ss)<0 )    /*本当は起動時1回だけ実行すれば良いが手抜き*/
  893.     return(0);
  894. for(i=j=0;ss[i]==0x20;i++);
  895. if ( n!=0 ){
  896.     for(;;i++){
  897.         if ( ss[i]==' ' ){
  898.             while( ss[++i]==' ' );
  899.             if ( ++j==n )
  900.                 break;
  901.         }
  902.         if ( ss[i]==0 )
  903.             return(0);
  904.     }
  905. }
  906. for(j=i;ss[j]!=0&&ss[j]!=' ';j++);
  907. ss[j]=0;
  908. return( &ss[i] );
  909. }
  910. /****************************************/
  911. /*        ヘルプ表示        */
  912. /****************************************/
  913. void cd2pcm_help( void )
  914. {
  915. printf(    "\n"
  916.     "使用法:CD2PCMt.x [options] [曲番号] [演奏開始時間-終了時間] [ALL]\n"
  917.     "  曲番号           : 演奏するCDの曲番号を指定します。\n"
  918.     "  u:v:w-           : u分v秒w~最後まで演奏します。\n"
  919.     "  u:v:w-x:y:z      : u分v秒w~x分y秒zまで演奏します。\n"
  920.     "  ?/u:v:x          : ? 曲目のu分v秒w~最後まで演奏します。\n"
  921.     "  ?/u:v:w-x:y:z    : ? 曲目のu分v秒w~x分y秒zまで演奏します。\n"
  922.     "  ALL              : 全曲演奏します。\n"
  923.     "{options}\n"
  924.     "  -s               : 演奏中断します。\n"
  925.     "  -c               : 演奏再開します。\n"
  926.     "  -l               : 演奏時間を表示します。\n"
  927. //    "  -i[x]            : SCSI-IDを設定します。\n"
  928.     "  -id[x]           : SCSI-IDを設定します。\n"
  929.     "\n"
  930.     "  -g[x]            : [x] 曲目のオーディオデータを読み込みます。\n"
  931.     "  -gt[u]:[v]:[w]-  : [u]分[v]秒[w]~最後までのAUDIO-DATAを読み込みます。\n"
  932.     "  -gt[u]:[v]:[w]-[x]:[y]:[z]\n"
  933.     "                   : [u]分[v]秒[w]~[x]分[y]秒[z]までのAUDIO-DATAを読み込みます。\n"
  934.     "  -gt[?]/[u]:[v]:[w]-\n"
  935.     "                   : [?] 曲目の[u]分[v]秒[w]~最後までのAUDIO-DATAを読み込みます。\n"
  936.     "  -gt[?]/[u]:[v]:[w]-[x]:[y]:[z]\n"
  937.     "                   : [?] 曲目の[u]分[v]秒[w]~[x]分[y]秒[z]までのAUDIO-DATAを読み込みます。\n"
  938.     "\n"
  939.     " 以下のオプションは、-g 又は -gt が指定された時のみ有効です。\n"
  940.     "  -test            : 読み込みテストのみします。ファイルを作りません。\n"
  941.     "  -pn              : 実行中の表示を行いません。\n"
  942.     "  -o[filename]     : 出力ファイル名の指定。-o の後に空白を空けずに指定します。\n"
  943.     "                     指定しなければ、test.* となります(拡張子は記録モードによる)。\n"
  944.     "  -ma              : メモリに読み込める限り読み込んで処理を行います(def.)。\n"
  945.     "  -m[n]            : [n]秒分読み込んで処理を行います。\n"
  946.     "  -check           : 数回データを読み込み、比較してより正しいデータを得ます。\n"
  947.     "  -checks          : 数回データを読み込み、比較して非常に正しいデータを得ます。\n"
  948. ///    "  -chkp[n]         : 比較の時n%同じなら一致したとします。\n"
  949.     "  -secone          : 1セクタ毎読み込む様にします。\n"
  950.     "  -retry[n]        : 読み込みエラーが出た場合、[n]回挑戦します。\n"
  951.     "  -errjmp          : 致命的でないエラーは無視します。\n"
  952.     "  -errod           : -errjmp で無視したエラーセクタのデータは前データのものを使用します。\n"
  953. //    "  -mbr7            : エラーの際、ZEROUNIT & SEEK を実行します。\n"
  954.     "\n"
  955. ///    "  -dma             : 読み込みに DMA を使用します。\n"
  956.     "  -mpu             : 読み込みに MPU を使用します。\n"
  957.     "\n"
  958. //    "  -sony            : SONY系のRead CD-DA命令を使用します(def.=デバイスのInquiryで判断)。\n"
  959.     "  -toshiba         : TOSHIBA系のRead CD-DA命令を使用します(def.= SONY系のRead CD-DA を使用)。\n"
  960.     "\n"
  961.     "  -normal          : 標準速で読み込みます。\t\tCDU-561&55S の時のみ有効です。\n"
  962.     "  -fast            : 倍速で読み込みます。\t\tCDU-561&55S の時のみ有効です。\n"
  963.     "  -ultra           : 最大速で読み込みます。\t\tCDU-561&55S の時のみ有効です。\n"
  964.     "  -cdspeed[n]      : 読み込み速度を指定します。\t\tMMC 対応ドライブのみ有効です。\n"
  965.     "\n"
  966.     "  -pcms            : 44.1kHz 16bit ステレオの PCM(ベタ)で記録します[*.S44]。\n"
  967.     "  -pcma            : 44.1kHz 16bit ステレオの ADPCM で記録します[*.A44]。\n"
  968.     "  -pcmr            : 44.1kHz 16bit 右のみを PCM(ベタ)で記録します[*.M44]。\n"
  969.     "  -pcml            : 44.1kHz 16bit 左のみを PCM(ベタ)で記録します[*.M44]。\n"
  970.     "  -pcmm            : 44.1kHz 16bit 左右ミキシング PCM(ベタ)で記録します[*.M44]。\n"
  971.     "  -wave            : 44.1kHz 16bit ステレオの WAVE 型式で記録します[*.WAV]。\n"
  972. ///    "  -a88             : 88.2kHz 16bit ステレオの ADPCM で記録します[*.A88]。\n"
  973.     "  -pcm15           : 15.6kHz 16BIT PCM に変換し記録します[*.P16]。\n"
  974.     "  -adpcm           : 15.6kHz ADPCM に変換し記録します[*.PCM](def.)。\n"
  975.     "\n"
  976.     " 以下のオプションは、-pcms or -pcma or -wave が指定された時のみ有効です。\n"
  977.     "  -hrate           : ハーフレート(22.05kHz)にします。\n"
  978.     "\n"
  979.     " 以下のオプションは、-pcm15 or -adpcm が指定された時のみ有効です。\n"
  980. //    "  -数値            : 音量を調節します。小さいほど音は大きくなります(def.16)\n"
  981.     "  -v[数値]         : 音量を調節します。小さいほど音は大きくなります(def.16)\n"
  982.     "  -rate[数値]      : 変換レートを指定します(def.=15625{15.625kHz})。\n"
  983.     "  -mix             : 左右をミキシングして記録します(def.)。\n"
  984.     "  -right           : 右のみを記録します。\n"
  985.     "  -left            : 左のみ記録します。\n"
  986.     "  -am              : 左右をミキシング、補間処理して記録します。\n"
  987.     "  -ar              : 右のみを補間処理して記録します。\n"
  988.     "  -al              : 左のみを補間処理して記録します。\n"
  989.     "\n"
  990.     "  -env             : 環境変数 CD2PCM を参照しません。\n"
  991.     "\n"
  992.     "        環境変数 CD2PCM の内容がコマンドラインの最後に追加されます\n"
  993. );
  994.  
  995. }
  996.  
  997. asm("
  998.     .XDEF    _STACK_SIZE
  999. _STACK_SIZE    EQU    32*1024
  1000.     .XDEF    _HEAP_SIZE
  1001. _HEAP_SIZE    EQU    8*1024
  1002. ");
  1003.  
  1004.  
  1005.